function dd() {
    if (typeof console != 'undefined') {
        for(var i = 0;i < arguments.length;i++) console.log(arguments[i]);
    }
}
/**
 * 记录日志
 * @param  {string} info
 */
function log_system(info) {
    dd(info);
    $.post('/admin/log/system', {
        'info': info
    });
}

//加法函数，用来得到精确的加法结果 
//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用：accAdd(arg1,arg2) 
//返回值：arg1加上arg2的精确结果
function accAdd(arg1, arg2) {
    var r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    };
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    };
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m;
}

//减法函数，用来得到精确的减法结果 
//说明：javascript的减法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 
//调用：accSubtr(arg1,arg2) 
//返回值：arg1减去arg2的精确结果 
function accSubtr(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}


//乘法函数，用来得到精确的乘法结果 
//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 
//调用：accMul(arg1,arg2) 
//返回值：arg1乘以arg2的精确结果 
function accMul(arg1, arg2) {
    var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length
    } catch (e) {}
    try {
        m += s2.split(".")[1].length
    } catch (e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

//除法函数，用来得到精确的除法结果 
//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 
//调用：accDiv(arg1,arg2) 
//返回值：arg1除以arg2的精确结果 
function accDiv(arg1, arg2) {
    var t1 = 0,
        t2 = 0,
        r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length
    } catch (e) {}
    try {
        t2 = arg2.toString().split(".")[1].length
    } catch (e) {}
    with(Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return (r1 / r2) * pow(10, t2 - t1);
    }
}

/**
 * php strtr 2个参数版
 * @param  {string} str   
 * @param  {object} assoc 
 * @return {string}       
 */
function strtr(str, assoc) {
    for (var k in assoc) {
        str = str.replace(new RegExp(k, 'g'), assoc[k]);
    }

    return str;
}

/**
 * 获取模板中已设置的csrf
 * @return {[type]} [description]
 */
function csrf_token() {
    return $("meta[name='csrf-token']").attr('content');
}

/**
 * 获取模板中已设置的上传控制器
 * @return {[type]} [description]
 */
function upload_route() {
    return $("meta[name='upload-route']").attr('content');
}


// todo.. 可优化成无需传js参数即可上传
//AJAX上传base64
function base64_uploading(base64, nameid, target) {
    $.ajax({
        type: 'POST',
        url: "/admin/news/uploadz",
        data: {
            '_token': csrf_token(),
            'base64': base64,
            'path': $("#" + nameid).data('path') || 'goods'
        },
        dataType: 'json',
        timeout: 50000,
        success: function(data) {
            data = JSON.parse(data)
            // 如果有-表示是多个图
            if(nameid.indexOf('-') != -1){
                var temp = nameid.split('-');
                nameid = temp[0] + '[' + temp[1] + ']';
            }

            console.log(data.status)
            if (data.status == 1) {
                alert('上传成功')
                var submit_input = $("input[name='" + nameid + "']");

                if (submit_input.length == 1) {
                    submit_input.val(data.url);
                } else {
                    var inputs = document.createElement('input');
                    inputs.setAttribute('type', 'hidden');
                    inputs.setAttribute('name', nameid);
                    inputs.value = data.url;
                    document.getElementById(target).appendChild(inputs);
                }
            }
        },
        error: function(req, msg) {
            alert('上传失败')
            log_system('上传图片失败:' + msg);
        }
    })
}

function uploadPhoto(input, target) {
    document.querySelector(input).onchange = function(evt) {
        var files = evt.target.files;
        var nameid = evt.target.id;

        $("#"+target).find('img').hide();
        
        for (var i = 0, f; f = files[i]; i++) {
            if (!f.type.match('image.*')) continue;

            var reader = new FileReader();
            reader.onload = (function(theFile) {
                return function(e) {
                    var img = document.createElement('img');
                    img.title = theFile.name;
                    img.src = e.target.result;
                    img.setAttribute('data-img', 'uploadImg');
                    document.getElementById(target).appendChild(img);

                    compressImg(reader.result, 800, theFile.type, function(data) { //压缩完成后执行的callback
                        base64_uploading(data, nameid, target);

                    });
                }
            })(f);
            reader.readAsDataURL(f);
            $(this).parent().prev().show();
        }
    }
}

function compressImg(imgData, maxHeight, img_type, onCompress) {
    if (!imgData) return;
    onCompress = onCompress || function() {};
    maxHeight = maxHeight || 800; //默认最大高度200px

    var canvas = document.createElement('canvas');
    var img = new Image();
    // 记住必须先绑定事件，才能设置src属性，否则img没内容可以画到canvas
    img.src = imgData;
    img.onload = function() {
        var cw = img.width;
        var ch = img.height;
        var w = img.width;
        var h = img.height;
        canvas.width = w;
        canvas.height = h;
        if (cw > 1000 && cw > ch) {
            w = 1000;
            h = (1000 * ch) / cw;
            canvas.width = w;
            canvas.height = h;
        }
        if (ch > 1000 && ch > cw) {
            h = 1000;
            w = (1000 * cw) / ch;
            canvas.width = w;
            canvas.height = h;
        }
        var ctx = canvas.getContext("2d");
        //重置canvans宽高 canvas.width = img.width; canvas.height = img.height;
        ctx.clearRect(0, 0, canvas.width, canvas.height); // canvas清屏
        ctx.drawImage(img, 0, 0, w, h); // 将图像绘制到canvas上 

        onCompress(canvas.toDataURL(img_type)); //必须等压缩完才读取canvas值，否则canvas内容是黑帆布
    };
}

// 点击编辑列表页的某个字段 文本框
var click_editing = false;// 确保ajax请求完再触发下一个的编辑
$(".click_edit_text").click(function() {
    var _this     = $(this),
        old_text  = _this.html(),
        tempTr    = _this.closest('tr'),
        id        = tempTr.data('id'),// 该记录主键字段值
        editField = _this.data('edit-field'),// 需修改的字段名
        tempTbody = _this.closest('tbody'),
        url       = tempTbody.data('field-edit-url'),// 路由 权限控制作用
        model     = tempTbody.data('model'),// 需修改字段所在模型
        callback  = _this.data('callback'),// 修改成功后回调 参数为(该行obj, 新值，旧值)
        allow     = _this.data('allow');// 允许输入的值

    if(click_editing){
        return;
    }

    if(old_text.indexOf('<input') != -1){
        return ;
    }
    if(!model || !id || !editField){
        var msg = 'missing ' + (!model ? 'model' : (!id ? 'id' : 'editField'));
        log_system('click edit ' + msg);
        layer.alert(msg);
        return;
    }

    click_editing = true;

    var w = _this.width(),
        input = '<input style="width:' + w +'px;" type="text" value="' + old_text + '">';

    _this.html('');
    $(input).appendTo(_this).focus().blur(function(){
        var new_text = $(this).val();

        if(typeof allow != 'undefined'){
            allow = eval(allow).map(function(v){
                return v.toString();
            });
            if($.inArray(new_text, allow) == -1){
                layer.alert('该处只可输入:' + allow.join('或'), function(){
                    _this.html(old_text);
                    layer.closeAll();
                });
                return;
            }
        }

        _this.html(new_text);

        if(new_text != old_text){
            $.post(url, {_token: csrf_token(), model: model, id: id, field: editField, value: new_text}, function(d){
                if(d != 1){
                    location.reload();
                }

                if(typeof callback != 'undefined'){
                    callback = eval(callback);
                    callback.call(null, tempTr, new_text, old_text);
                }

                click_editing = false;
            });
        }else{
            click_editing = false;
        }
    });
});

// 表单搜索参数拼成插件自动识别的格式
$(".searchForm").submit(function(e) {
    var url = $(this).attr('action');
    var search = [], // 键值 如user_id:1;xx:2
        searchFields = [], // 字段 如user_id:=;xx:>
        orderBy = [], // 排序字段 如id|x_id
        sortedBy = [], // 排序 如desc
        ignore  = '', //额外件值
        todo = {}; // 用于处理between这样的特殊查询

     /**
     * 如果指定了提交前执行的代码 且触发submit事件的来源元素设置了触发 则执行提交前代码 根据返回值判断是否提交
     * 表单需指定自定义验证函数名：data-before-submit="func"
     * 触发自定义验证逻辑的submit按钮需包含data-trigger-before-submit="1"
     * @type {[type]}
     */
    var beforeSubmit = $(this).data('before-submit'),
        triggerBeofreSubmit = $(e.originalEvent.explicitOriginalTarget || document.activeElement).data('trigger-before-submit') == 1;

    // 执行自定义验证
    if(typeof beforeSubmit != 'undefined' && triggerBeofreSubmit){
        var result = eval(beforeSubmit).call(null);
        // 验证失败则不提交
        if(result === false){
            return false;
        }
    }

    // 设置单一查询参数为直接拼接形式
    var set_query_param_direct = function(input) {
        //排除字段
        if (input.attr('data-is-exclude') == '1') {
            input.val('');
        }
        var key = input.attr('name'),
            val = input.val(),
            searchType = input.data('search-type') || '=';
        if (input.attr('data-ignore') == '1') {
            return true;
        }

        if (!val && val !== 0) return true;
        search.push(key + ':' + val);
        searchFields.push(key + ':' + searchType);
    };
    // 设置between查询
    var set_query_param_between = function(inputs) {
        for (var input_name in inputs) {
            // 只有2个参数都有值才会使用between
            var all_input_filled = true,
                obj_input_filled,
                tempSearch = [];

            for (var k in inputs[input_name]) {
                var input = inputs[input_name][k],
                    val = input.val();
                // 如果其中有个值为空 那么就不需要between查询
                if (!val) {
                    all_input_filled = false;
                    continue;
                } else {
                    // 记录下有值的input
                    obj_input_filled = input;
                }
                tempSearch.push(val);
            }

            if (!all_input_filled || inputs[input_name].length == 1) {
                // 使用单个
                set_query_param_direct(obj_input_filled);
            } else {
                // 使用between
                search.push(input_name + ':' + tempSearch.join(','));
                searchFields.push(input_name + ':' + 'between');
            }
        }
    }

    try {
        // 获取输入框值并拼接
        $(this).find('[name]').each(function() {
            var key = $(this).attr('name'),
                default_value = $(this).data('default-value');

            // 如果有指定默认值 那么以指定的默认值来判断是否跳过
            if(typeof default_value != 'undefined'){
                if($(this).val() == default_value){
                    return true;
                }
            }else{
                if (!$(this).val() && $(this).val() !== 0) {
                    return true;
                }
            }
            if ($(this).data('ignore') == '1') {
                ignore += '&' + key + '=' + $(this).val();
                return true;
            }


            // 标示为查询区间的在后面代码里处理
            if ($(this).data('is-between') == '1') {
                if (typeof todo['between'] == 'undefined') {
                    todo['between'] = {};
                }
                if (typeof todo['between'][key] == 'undefined') {
                    todo['between'][key] = [];
                }

                todo['between'][key].push($(this));
                return true;
            }

            set_query_param_direct($(this));
        });
        // 获取排序
        // todo..
        // 插件貌似不支持单表多字段排序
        $(this).find('[data-order-by]').each(function() {
            orderBy.push($(this).data('order-by'))
            sortedBy.push($(this).data('sorted-by'));
            return false;
        });

        for (var type in todo) {
            switch (type) {
                // 处理between查询
                case 'between':
                    set_query_param_between(todo[type]);
                    break;
            }

        }

        var op = url.indexOf('?') != -1 ? '&' : '?',
            redirect_url = url + op + 'search=' + search.join(';') + '&searchFields=' + searchFields.join(';') + ignore;

        if (orderBy.length > 0) {
            redirect_url += '&orderBy=' + orderBy.join('|') + '&sortedBy=' + sortedBy.join('|');
        }

        location.href = redirect_url;
        return false;

    } catch (e) {
        log_system('search form build query param failed.' + e.message);
    }

});

// js填充搜索数据到输入框...
(function() {
    if (!location.search || location.search.match(/^\?page=\d+$/)) {
        return;
    }
    var searchForm = $(".searchForm");
    if (searchForm.length == 0) {
        return;
    }

    try {
        var url = decodeURIComponent(location.search),
            match = url.match(/search=(.*?)&searchFields=(.*?)(?:&|$)/),
            search = match[1].split(';'),
            searchFields = match[2].split(';');

        $(search).each(function(k, v) {
            var temp = v.split(':'),
                input_name = temp[0],
                tempSearchFields = searchFields[k].split(':'),
                tempSearchType = tempSearchFields[1];

            var input_val = v.replace(input_name + ':', ''),
                input_val = input_val.split(',');

            switch (tempSearchType) {
                // 如果是between搜索 按参数顺序对应input顺序填充
                case 'between':
                    searchForm.find("[name='" + input_name + "']").each(function(k, v) {
                        $(this).val(input_val[k]);
                    });
                    break;
                default:
                    tempSearchType = tempSearchType == '=' ? '' : '[data-search-type="' + tempSearchType + '"]';

                    var obj_input = searchForm.find("[name='" + input_name + "']" + tempSearchType);

                    obj_input.val(input_val[0]);

                    // 兼容省市区联动
                    if($.inArray(obj_input.attr('id'), ['province', 'city', 'area']) != -1){
                        obj_input.change();
                    }
            }

        });

    } catch (e) {
        log_system('fill in input with url query param failed.' + e.message);
    }
})();


function zmq_modal(href) {
    $(".zmq_modal").click(function() {
        //  var id = $(this).attr('ids');
        // var href = "/admin/outinmanage/change?id=" + id;
        //URL拼写完成
        //模态窗口的html字符串
        var modaldiv = '<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">';
        modaldiv += '    <div class="modal-dialog" role="document">';
        modaldiv += '        <div class="modal-content">';
        modaldiv += '        </div>';
        modaldiv += '    </div>';
        modaldiv += '</div>';
        //之前存在模态窗口删除
        if ($("#myModal").size() > 0) {
            $("#myModal").remove();
        }
        //插入新的模态窗口html
        $('body').eq(0).append(modaldiv);
        //初始化模态窗口
        $("#myModal").modal({
            show: false,
            remote: href
        });
        //显示模态窗口
        $('#myModal').modal('show');
    });
}

/**
 * 点击列表页编辑按钮根据所在行获取相应信息并填充到弹出层
 * 弹出层需加上data-from属性，对应列表页点击编辑所在行的相应信息
 * 可参考：userGrade/table.blade.php
 * 
 */
if ($(".show-modal").length != 0) {
    $(".show-modal").click(function() {
        var tr = $(this).closest('tr');

        // 有tr的话就填充
        if(tr.length != 0){
            // todo.. 改成公共函数通过modal获取
            $("#modal").find('[data-from]').each(function() {
                var from = $(this).data('from'),
                    obj_from = tr.find(from),
                    tagName = obj_from[0].tagName.toLowerCase(), // 判断原始标签是什么类别
                    val;

                switch (tagName) {
                    case 'input':
                        val = obj_from.val();
                        break;
                        // 如果原始标签是图片 那么直接改弹出层标签的src
                    case 'img':
                        val = obj_from.attr('src');
                        $(this).attr('src', val);
                        return true;
                        break;
                    default:
                        val = obj_from.text();
                        break;
                }

                $(this).val(val);
            });
        }

        $('#modal').modal();
    });
}

// 左侧菜单当点击到编辑等没添加过节点的页面时,不会自动展开菜单问题
(function(){
    // 不是点击进去的详细页
    if(!document.referrer){
        return;
    }
    var sidebar = $("#sidebar");
    // 有已展开的菜单那么不再处理了
    if(sidebar.length == 0 || sidebar.find('.active').length > 0){
        return;
    }
    try{
        // 展开上一个页面的url
        var previous_url = document.referrer.replace(location.protocol + '//' + location.host, '');

        sidebar.find("a[href='"+previous_url+"']").parents('li').addClass('active');
    }catch(e){

    }
})();

$.fn.extend({
    /**
     * 全选/取消联动功能
     * @param  {object} $(this) 全选按钮
     * @param  {object} param[other_input] 其他复选框 需要跟着全选联动的
     * @param  {object} param[after_check_all] 点击全选复选框回调 回调函数return false时不再选中
     * @param  {object} param[after_check_other] 点击其他复选框回调 回调函数return false时不再选中
     * @return {[type]}       [description]
     */
    check_all: function(param) {
        var cfg = $.extend({
                other_input: null,
                after_check_all: null,
                after_check_other: null
            }, param),
            check_all_input = $(this),
            other_input_length = cfg.other_input.length;

        // 已绑定的不再绑定
        if (check_all_input.data('binded')) {
            return -1;
        }
        if (check_all_input.length == 0 || other_input_length == 0) {
            return -2;
        }

        check_all_input.data('binded', 1);
        // 点击全选
        check_all_input.click(function(e) {
            var checked = $(this).prop('checked');
            if (cfg.after_check_all != null) {
                var res = cfg.after_check_all.call(null, $(this), checked, e);
                if (res === false) {
                    return false;
                }
            }
            cfg.other_input.prop('checked', checked);
        });
        // 点击一个复选框
        cfg.other_input.click(function(e) {
            var checked = $(this).prop('checked');

            if (cfg.after_check_other != null) {
                var res = cfg.after_check_other.call(null, $(this), checked, e);
                if (res === false) {
                    return false;
                }
            }
            if (!checked) {
                check_all_input.prop('checked', false);
            } else {
                if (cfg.other_input.filter(':checked').length == other_input_length) {
                    check_all_input.prop('checked', true);
                }
            }
        });
    }
});




function addObjClass (styleClass) {
	var obj = $("." + styleClass),
        url = obj.attr("url"),
        keyword = $("input[name='"+styleClass+"']").val();

	if (keyword == '') {
		return false;
	}
	$.ajax({
        type: 'POST',
        url: url,
        data: {
            '_token': csrf_token(),
            'keyword': keyword,
        },
        dataType: 'json',
        timeout: 50000,
        success: function(res) {
            var obj_select = $('#'+styleClass);
            // 已存在
            if(res == -1){
                layer.alert(obj.data('error-exists'));
                // 选中
                obj_select.val(obj_select.find('option:contains("'+keyword+'")').val());
                return false;
            }
            obj_select.html(res);
        }
	})
}

//layer 加载页面
function openPage(url,title,width,height){
    width = width ? width+'px' : '500px';
    height = height ? height+'px' : '300px';
    layer.ready(function(){
         layer.open({
             type: 2,
             title: title,
             maxmin: true,
             area: [width, height],
             content: url,
             end: function(){
                 layer.tips('Hi', '#about', {tips: 1})
             }
         });
     });
}

/**
 *异步提交表单数据
 *表单ID要用 form_id
 * 表单的action 就是请求的url
 * 错误提示ID 用 errorMsg
 */
function ajaxSubmit(form_id,error_type){
    form_id = form_id ? $("#"+form_id) : $('#form_id');
    var form_data = form_id.serialize();
    var url = form_id.attr('action');
    var error_type = error_type ? true : false;//1：弹窗，0：不是弹窗

    $.ajax({
        type: 'POST',
        url: url,
        data: form_data,
        dataType: 'json',
        success: function(res) {
            if(res.status == '1') {
                layer.msg(res.msg,{icon: 1});

                setTimeout(function(){
                    parent.location.reload();
                    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
                    parent.layer.close(index);
                },1000);
            }else{
                if(error_type){
                    layer.msg(res.msg,{icon: 5});
                }else{
                    $("#errorMsg").css('color','red').html(res.msg);
                }
            }
        }
    })
}

/**
*关闭弹出框
*/
function closeLayer(){
    parent.location.reload();
    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
    parent.layer.close(index);
}

/**
 * 获取当前URL带参数
 * @returns {string}
 */
function getCurrentPageUrl() {
    return window.location.pathname+window.location.search
}

/**
 * 跳转到指定URL
 * @param url 无法为空则是当前
 */
function hrefTo(url) {
    if (url == undefined) {
        url = getCurrentPageUrl()
    }
    console.log(url)
    window.location.href = url
}

// jq validate
$(".checkForm").validate();



